//
//  ZHRouter.h
//  ZHRouter_Example
//
//  Created by 赵宏亚 on 2019/8/24.
//  Copyright © 2019 Arthur. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ZHRPathComponent.h"

NS_ASSUME_NONNULL_BEGIN

/**
 只有一个功能，就是跳转页面，不用太复杂
 1. 使用BeeHive的protocol跳转的
 2. 根据CTMediator跳转
 3. 直接跳转
 跳转类型 Push 或者 present
 */

static NSString *const ZHRURLSchemeGlobalKey = @"URLGlobalScheme";
static NSString *const ZHRURLSubPathSplitPattern = @".";


static NSString *const ZHRURLNormalJump = @"vc.jump.zh";
static NSString *const ZHRURLVCJumpPush = @"push";
static NSString *const ZHRURLVCJumpPresent = @"present";

typedef void(^ZHRPathComponentCustomHandler)(NSDictionary<NSString *, id> *params);

typedef NS_ENUM(NSUInteger, ZHRViewControlerEnterMode) {
    ZHRViewControlerEnterModePush, // push类型跳转
    ZHRViewControlerEnterModePresent // present类型显示
};

typedef NS_ENUM(NSUInteger, ZHRUsage) { // 跳转方式
    ZHRUsageUnknown,
    ZHRUsageNormalJump // 正常跳转
};

@interface ZHRouter : NSObject

// 关闭初始化方法
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;

// 获取 globalRouter
+ (instancetype)globalRouter;

// 根据scheme获取router
+ (instancetype)routerForScheme:(NSString *)scheme;


/**
 注册路由，跳转页面不需要参数时使用

 @param pathComponentKey 路由的标记
 @param name 可以是VC的名字，也可以是protocol的名字
 */
- (void)addPathComponent:(NSString *)pathComponentKey
          withName:(NSString *)name;

/**
  注册路由，有返回参数自己自定义跳转

 @param pathComponentKey 路由的标记
 @param name 可以是VC的名字，也可以是protocol的名字
 @param handler 返回参数
 */
- (void)addPathComponent:(NSString *)pathComponentKey
                withName:(NSString *)name
                 handler:(ZHRPathComponentCustomHandler)handler;


/**
 可以注册key移除注册的路由信息

 @param pathComponentKey 注册路由的标记key
 */
- (void)removePathComponent:(NSString *)pathComponentKey;


// 判断是否可以打开URL
+ (BOOL)canOpenURL:(NSURL *)URL;

// 直接打开URL
+ (BOOL)openURL:(NSURL *)URL;

// 打开URL同时添加自己想添加的额外参数
+ (BOOL)openURL:(NSURL *)URL
     withParams:(NSDictionary<NSString *, NSDictionary<NSString *, id> *> *)params;


@end

NS_ASSUME_NONNULL_END
